package com.hjj.listener;

import com.mysql.cj.jdbc.AbandonedConnectionCleanupThread;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;

/**
 * ServletContextListener该接口为Tomcat服务监听器
 * 监听Tomcat的服务启动和结束
 * 其中可以使用ServletContext对象获取全局变量
 * HttpServlet：
 *      代表一个请求响应对象，第一个请求的时候创建，Tomcat结束的时候消亡，
 *      一个Tomcat服务有很多HttpServlet对象，
 *      同一个HttpServlet对象在Tomcat服务器里面只有一个实例
 * HttpServletRequest：
 *      每次请求都会生成一个HttpServletRequest对象，响应结果的时候就对象消亡【浏览器看到结果了】
 *      HttpServletRequest中的跳转会延续生命周期【forward】
 *      a[forward]->b[forward]->c   这时候a会延续到c的生命周期【地址栏中的地址依然是a】
 *      a[sendRedirect]->b[sendRedirect]->c   这时候b出现的时候a就死掉了，c出现的时候b就死掉了
 * HttpServletResponse：
 *      每次响应都会生成一个HttpServletResponse对象，响应结束的时候就对象消亡【浏览器看到结果了】
 * ServletContext：
 *      代表Tomcat服务对象，Tomcat启动的时候创建，Tomcat结束的时候消亡，
 *      一个Tomcat服务就一个ServletContext
 *
 */

/**
 * 使用Tomcat监听器关闭所有的数据驱动
 */
@WebListener
public class MyServletContextListener implements ServletContextListener {
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        // 获取所有驱动对象
        Enumeration<Driver> drivers = DriverManager.getDrivers();

        // 遍历获取驱动对象
        while (drivers.hasMoreElements()){

            // 销毁驱动对象
            try {
                DriverManager.deregisterDriver(drivers.nextElement());
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
        // 再关闭AbandonedConnectionCleanupThread线程
        AbandonedConnectionCleanupThread.checkedShutdown();

    }
}
